This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library("BiocManager")
Bioconductor version 3.16 (BiocManager 1.30.20), R 4.2.0 (2022-04-22)
Bioconductor version '3.16' is out-of-date; the current release version '3.17' is available with R version '4.3'; see https://bioconductor.org/install
library("ComplexHeatmap")
Warning: package ‘ComplexHeatmap’ was built under R version 4.2.1
Loading required package: grid
========================================
ComplexHeatmap version 2.14.0
Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
Github page: https://github.com/jokergoo/ComplexHeatmap
Documentation: http://jokergoo.github.io/ComplexHeatmap-reference

If you use it in published research, please cite either one:
- Gu, Z. Complex Heatmap Visualization. iMeta 2022.
- Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
    genomic data. Bioinformatics 2016.


The new InteractiveComplexHeatmap package can directly export static 
complex heatmaps into an interactive Shiny app with zero effort. Have a try!

This message can be suppressed by:
  suppressPackageStartupMessages(library(ComplexHeatmap))
========================================
library("grid")
library("dendsort")
library(circlize)
========================================
circlize version 0.4.15
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================
col_fun = colorRamp2(c(-0.5, 0, 0.5), c("red", "white", "blue"))
col_fun(seq(-3, 3))
[1] "#FF0000FF" "#FF0000FF" "#FF0000FF" "#FFFFFFFF" "#0000FFFF" "#0000FFFF" "#0000FFFF"
library(circlize)
========================================
circlize version 0.4.15
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================
col_fun = colorRamp2(c(-0.5, 0, 0.5), c("red", "white", "blue"))
col_fun(seq(-3, 3))
[1] "#FF0000FF" "#FF0000FF" "#FF0000FF" "#FFFFFFFF" "#0000FFFF" "#0000FFFF" "#0000FFFF"
corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)", 
    column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")
Heatmap(corrMat, cluster_rows = FALSE, column_title = "NRF2 signature (24 genes)", 
    column_title_side = "bottom")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/antioxidant network screen/r values signature screen.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, cluster_rows = FALSE, name = "Pearson correlation \n coefficient",cluster_columns = col_dend, col = col_fun,column_title = "Correlation of antioxidant transcription factor activity \n with RRM2B expression", 
        column_title_side = "bottom")
corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL
corrData$AOS <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)", 
    column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/AOS screen/r values AOS-genes-screen-imputed.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
Heatmap(corrMat, cluster_rows = FALSE, column_title = "Antioxidant gene signature (41 genes)", 
    column_title_side = "bottom", cluster_columns = col_dend, col = col_fun, name = "Pearson correlation \n coefficient")

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values signature screen with bach.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

Heatmap(corrMat, cluster_rows = FALSE, name = "Pearson correlation \n coefficient", 
        column_title = "Correlation of antioxidant transcription factor activity \n with RRM2B expression (with BACH genes)", 
        column_title_side = "bottom")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/GSTA4 GSTA1 GSTP1 comparison/r values cancer screen (GSTA4, GSTP1, GSTA1).csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))
rn <- rownames(corrMat)
print(rn)
[1] "RRM2B - AOS"  "RRM2B - NRF2" "RRM2B - p53"  "p53 - NRF2"   "p53 - AOS"    "p53 - G6PD"   "RRM2B - G6PD"
Heatmap(corrMat, 
        cluster_rows = FALSE, 
        name = "Pearson correlation \n coefficient",
        cluster_columns = col_dend, 
        col = col_fun)

c_order <- c('HCCDB.1', 'HCCDB.3', 'HCCDB.4',  'HCCDB.8', 'HCCDB.9', 'HCCDB.11', 
       'HCCDB.12', 'HCCDB.13', 'HCCDB.14', 'HCCDB.16', 'HCCDB.17', 'HCCDB.18',
       'ACC', 'BLCA', 'DBLC', 'UCEC', 'SKCM', 'HNSC', 'PRAD', 'KIRP',
       'PAAD', 'SARC', 'CESC', 'COAD', 'LUSC', 'READ', 'KIRC', 'LIHC',
       'BRCA', 'OV', 'UCS', 'GBM', 'KICH', 'THCA', 'LGG', 'LUAD', 'MESO',
       'PCPG', 'TGCT', 'UVM', 'THYM', 'CHOL', 'ESCA', 'STAD', 'LAML', 'PANCAN')
r_order_41 <- c('RRM2B - AOS', 'RRM2B - NRF2 signature', 'RRM2B vs G6PD', 'RRM2B - p53 signature', 'p53 signature vs G6PD', 'NRF2 signature - p53 signature', 'AOS signature - p53 signature')
r_order_125 <- c('RRM2B - Oxidative stress',
                 'RRM2B - AOS', 
                 'RRM2B - NRF2',
                 'RRM2B - G6PD',
                 'RRM2B - p53',
                 'p53 - G6PD',
                 'p53 - NRF2',
                 'p53 - AOS')
r_order_41 <- c('RRM2B - AOS', 
                 'RRM2B - NRF2',
                 'RRM2B - G6PD',
                 'RRM2B - p53',
                 'p53 - G6PD',
                 'p53 - NRF2',
                 'p53 - AOS')
corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/without outlier correction NEW/r values cancer screen (final).csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        name = "Pearson correlation \n coefficient", 
        col = col_fun, 
        row_order = r_order_125,
        column_title = "without outlier correction")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/results/outlier corrected/r values cancer screen (final).csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        name = "Pearson correlation \n coefficient",
        col = col_fun, 
        column_order = c_order,
        row_order = r_order_125,
        column_title = "WITH outlier correction")

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values rrm2b.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        cluster_columns = FALSE,
        name = "Pearson correlation \n coefficient",
        col = col_fun)

corrData <- read.csv('//Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)
#col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        cluster_columns = FALSE,
        name = "Pearson correlation \n coefficient",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO aggregate.csv', header = TRUE)
Warning in read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on '/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO aggregate.csv'
#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

#col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        cluster_columns = FALSE,
        column_title = "RRM2B - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO aggregate.csv', header = TRUE)
Warning in read.table(file = file, header = header, sep = sep, quote = quote,  :
  incomplete final line found by readTableHeader on '/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO aggregate.csv'
#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

#col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        cluster_columns = FALSE,
        column_title = "p53 - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen pub set.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "RRM2B - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 41 AOS screen.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "RRM2B - 41 AOS", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen pub set.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "p53 - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 41 AOS screen.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "p53 - 41 AOS", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen v2.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "RRM2B - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen v2.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "p53 - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 41 AOS screen v2.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "RRM2B - 41  AOS", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 41 AOS screen v2.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "p53 - 41 AOS", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values RRM2B - 125 GO screen with average.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "RRM2B - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

corrData <- read.csv('/Users/shanghongsim/Documents/GitHub/HU-ATRi-Code-Repository/r values p53 - 125 GO screen with average.csv', header = TRUE)

#set specific column as row names
rownames(corrData) <- corrData$database

#remove original column from data frame
corrData$database <- NULL

corrMat <- data.matrix(corrData)

col_dend <- dendsort(hclust(dist(t(corrMat))))

Heatmap(corrMat, 
        cluster_rows = FALSE, 
        column_title = "p53 - 125 GO", 
        column_title_side = "bottom", 
        name = "r value",
        col = col_fun)

{r}

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4KClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLgoKYGBge3J9CmxpYnJhcnkoIkJpb2NNYW5hZ2VyIikKbGlicmFyeSgiQ29tcGxleEhlYXRtYXAiKQpsaWJyYXJ5KCJncmlkIikKbGlicmFyeSgiZGVuZHNvcnQiKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNpcmNsaXplKQpjb2xfZnVuID0gY29sb3JSYW1wMihjKC0wLjUsIDAsIDAuNSksIGMoInJlZCIsICJ3aGl0ZSIsICJibHVlIikpCmNvbF9mdW4oc2VxKC0zLCAzKSkKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBOUkYyIHNjcmVlbi1pbXB1dGVkLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL0FPUyBzY3JlZW4vciB2YWx1ZXMgQU9TLWdlbmVzLXNjcmVlbi1pbXB1dGVkLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTApjb3JyRGF0YSRBT1MgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQpIZWF0bWFwKGNvcnJNYXQsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBjb2x1bW5fdGl0bGUgPSAiQW50aW94aWRhbnQgZ2VuZSBzaWduYXR1cmUgKDQxIGdlbmVzKSIsIAogICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIGNvbCA9IGNvbF9mdW4sIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIpCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvcmVzdWx0cy9BT1Mgc2NyZWVuL3IgdmFsdWVzIEFPUy1nZW5lcy1zY3JlZW4taW1wdXRlZC5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKSGVhdG1hcChjb3JyTWF0LCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIkFudGlveGlkYW50IGdlbmUgc2lnbmF0dXJlICg0MSBnZW5lcykiLCAKICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIGNsdXN0ZXJfY29sdW1ucyA9IGNvbF9kZW5kLCBjb2wgPSBjb2xfZnVuLCBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3Jlc3VsdHMvYW50aW94aWRhbnQgbmV0d29yayBzY3JlZW4vciB2YWx1ZXMgc2lnbmF0dXJlIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKY29yckRhdGEkQU9TIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLGNsdXN0ZXJfY29sdW1ucyA9IGNvbF9kZW5kLCBjb2wgPSBjb2xfZnVuLGNvbHVtbl90aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBhbnRpb3hpZGFudCB0cmFuc2NyaXB0aW9uIGZhY3RvciBhY3Rpdml0eSBcbiB3aXRoIFJSTTJCIGV4cHJlc3Npb24iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3Jlc3VsdHMvbnJmMiBoZWF0bWFwL3IgdmFsdWVzIE5SRjIgc2NyZWVuLWltcHV0ZWQuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgY29sdW1uX3RpdGxlID0gIk5SRjIgc2lnbmF0dXJlICgyNCBnZW5lcykiLCAKICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgc2lnbmF0dXJlIHNjcmVlbiB3aXRoIGJhY2guY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKCkhlYXRtYXAoY29yck1hdCwgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJDb3JyZWxhdGlvbiBvZiBhbnRpb3hpZGFudCB0cmFuc2NyaXB0aW9uIGZhY3RvciBhY3Rpdml0eSBcbiB3aXRoIFJSTTJCIGV4cHJlc3Npb24gKHdpdGggQkFDSCBnZW5lcykiLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL0dTVEE0IEdTVEExIEdTVFAxIGNvbXBhcmlzb24vciB2YWx1ZXMgY2FuY2VyIHNjcmVlbiAoR1NUQTQsIEdTVFAxLCBHU1RBMSkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCnJuIDwtIHJvd25hbWVzKGNvcnJNYXQpCnByaW50KHJuKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjbHVzdGVyX2NvbHVtbnMgPSBjb2xfZGVuZCwgCiAgICAgICAgY29sID0gY29sX2Z1bikKCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgMTI1IEdPIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiTlJGMiBzaWduYXR1cmUgKDI0IGdlbmVzKSIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiUGVhcnNvbiBjb3JyZWxhdGlvbiBcbiBjb2VmZmljaWVudCIsCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gY29sX2RlbmQsIAogICAgICAgIGNvbCA9IGNvbF9mdW4pCgpgYGAKCmBgYHtyfQpjX29yZGVyIDwtIGMoJ0hDQ0RCLjEnLCAnSENDREIuMycsICdIQ0NEQi40JywgICdIQ0NEQi44JywgJ0hDQ0RCLjknLCAnSENDREIuMTEnLCAKICAgICAgICdIQ0NEQi4xMicsICdIQ0NEQi4xMycsICdIQ0NEQi4xNCcsICdIQ0NEQi4xNicsICdIQ0NEQi4xNycsICdIQ0NEQi4xOCcsCiAgICAgICAnQUNDJywgJ0JMQ0EnLCAnREJMQycsICdVQ0VDJywgJ1NLQ00nLCAnSE5TQycsICdQUkFEJywgJ0tJUlAnLAogICAgICAgJ1BBQUQnLCAnU0FSQycsICdDRVNDJywgJ0NPQUQnLCAnTFVTQycsICdSRUFEJywgJ0tJUkMnLCAnTElIQycsCiAgICAgICAnQlJDQScsICdPVicsICdVQ1MnLCAnR0JNJywgJ0tJQ0gnLCAnVEhDQScsICdMR0cnLCAnTFVBRCcsICdNRVNPJywKICAgICAgICdQQ1BHJywgJ1RHQ1QnLCAnVVZNJywgJ1RIWU0nLCAnQ0hPTCcsICdFU0NBJywgJ1NUQUQnLCAnTEFNTCcsICdQQU5DQU4nKQpyX29yZGVyXzQxIDwtIGMoJ1JSTTJCIC0gQU9TJywgJ1JSTTJCIC0gTlJGMiBzaWduYXR1cmUnLCAnUlJNMkIgdnMgRzZQRCcsICdSUk0yQiAtIHA1MyBzaWduYXR1cmUnLCAncDUzIHNpZ25hdHVyZSB2cyBHNlBEJywgJ05SRjIgc2lnbmF0dXJlIC0gcDUzIHNpZ25hdHVyZScsICdBT1Mgc2lnbmF0dXJlIC0gcDUzIHNpZ25hdHVyZScpCnJfb3JkZXJfMTI1IDwtIGMoJ1JSTTJCIC0gT3hpZGF0aXZlIHN0cmVzcycsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gQU9TJywgCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gTlJGMicsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gcDUzJywKICAgICAgICAgICAgICAgICAncDUzIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ3A1MyAtIE5SRjInLAogICAgICAgICAgICAgICAgICdwNTMgLSBBT1MnKQpyX29yZGVyXzQxIDwtIGMoJ1JSTTJCIC0gQU9TJywgCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gTlJGMicsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ1JSTTJCIC0gcDUzJywKICAgICAgICAgICAgICAgICAncDUzIC0gRzZQRCcsCiAgICAgICAgICAgICAgICAgJ3A1MyAtIE5SRjInLAogICAgICAgICAgICAgICAgICdwNTMgLSBBT1MnKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yZXN1bHRzL3dpdGhvdXQgb3V0bGllciBjb3JyZWN0aW9uIE5FVy9yIHZhbHVlcyBjYW5jZXIgc2NyZWVuIChmaW5hbCkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLCAKICAgICAgICBjb2wgPSBjb2xfZnVuLCAKICAgICAgICByb3dfb3JkZXIgPSByX29yZGVyXzEyNSwKICAgICAgICBjb2x1bW5fdGl0bGUgPSAid2l0aG91dCBvdXRsaWVyIGNvcnJlY3Rpb24iKQoKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy8vVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvcmVzdWx0cy9vdXRsaWVyIGNvcnJlY3RlZC9yIHZhbHVlcyBjYW5jZXIgc2NyZWVuIChmaW5hbCkuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBuYW1lID0gIlBlYXJzb24gY29ycmVsYXRpb24gXG4gY29lZmZpY2llbnQiLAogICAgICAgIGNvbCA9IGNvbF9mdW4sIAogICAgICAgIGNvbHVtbl9vcmRlciA9IGNfb3JkZXIsCiAgICAgICAgcm93X29yZGVyID0gcl9vcmRlcl8xMjUsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIldJVEggb3V0bGllciBjb3JyZWN0aW9uIikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy8vVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcnJtMmIuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignLy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBwNTMuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgbmFtZSA9ICJQZWFyc29uIGNvcnJlbGF0aW9uIFxuIGNvZWZmaWNpZW50IiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gMTI1IEdPIGFnZ3JlZ2F0ZS5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgojY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY2x1c3Rlcl9jb2x1bW5zID0gRkFMU0UsCiAgICAgICAgY29sdW1uX3RpdGxlID0gIlJSTTJCIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIHA1MyAtIDEyNSBHTyBhZ2dyZWdhdGUuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKI2NvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNsdXN0ZXJfY29sdW1ucyA9IEZBTFNFLAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJwNTMgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgUlJNMkIgLSAxMjUgR08gc2NyZWVuIHB1YiBzZXQuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY29sdW1uX3RpdGxlID0gIlJSTTJCIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gNDEgQU9TIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSA0MSBBT1MiLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gMTI1IEdPIHNjcmVlbiBwdWIgc2V0LmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJwNTMgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gNDEgQU9TIHNjcmVlbi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gNDEgQU9TIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gMTI1IEdPIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSAxMjUgR08iLCAKICAgICAgICBjb2x1bW5fdGl0bGVfc2lkZSA9ICJib3R0b20iLCAKICAgICAgICBuYW1lID0gInIgdmFsdWUiLAogICAgICAgIGNvbCA9IGNvbF9mdW4pCmBgYAoKYGBge3J9CmNvcnJEYXRhIDwtIHJlYWQuY3N2KCcvVXNlcnMvc2hhbmdob25nc2ltL0RvY3VtZW50cy9HaXRIdWIvSFUtQVRSaS1Db2RlLVJlcG9zaXRvcnkvciB2YWx1ZXMgcDUzIC0gMTI1IEdPIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIFJSTTJCIC0gNDEgQU9TIHNjcmVlbiB2Mi5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAiUlJNMkIgLSA0MSAgQU9TIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYHtyfQpjb3JyRGF0YSA8LSByZWFkLmNzdignL1VzZXJzL3NoYW5naG9uZ3NpbS9Eb2N1bWVudHMvR2l0SHViL0hVLUFUUmktQ29kZS1SZXBvc2l0b3J5L3IgdmFsdWVzIHA1MyAtIDQxIEFPUyBzY3JlZW4gdjIuY3N2JywgaGVhZGVyID0gVFJVRSkKCiNzZXQgc3BlY2lmaWMgY29sdW1uIGFzIHJvdyBuYW1lcwpyb3duYW1lcyhjb3JyRGF0YSkgPC0gY29yckRhdGEkZGF0YWJhc2UKCiNyZW1vdmUgb3JpZ2luYWwgY29sdW1uIGZyb20gZGF0YSBmcmFtZQpjb3JyRGF0YSRkYXRhYmFzZSA8LSBOVUxMCgpjb3JyTWF0IDwtIGRhdGEubWF0cml4KGNvcnJEYXRhKQoKY29sX2RlbmQgPC0gZGVuZHNvcnQoaGNsdXN0KGRpc3QodChjb3JyTWF0KSkpKQoKSGVhdG1hcChjb3JyTWF0LCAKICAgICAgICBjbHVzdGVyX3Jvd3MgPSBGQUxTRSwgCiAgICAgICAgY29sdW1uX3RpdGxlID0gInA1MyAtIDQxIEFPUyIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiciB2YWx1ZSIsCiAgICAgICAgY29sID0gY29sX2Z1bikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBSUk0yQiAtIDEyNSBHTyBzY3JlZW4gd2l0aCBhdmVyYWdlLmNzdicsIGhlYWRlciA9IFRSVUUpCgojc2V0IHNwZWNpZmljIGNvbHVtbiBhcyByb3cgbmFtZXMKcm93bmFtZXMoY29yckRhdGEpIDwtIGNvcnJEYXRhJGRhdGFiYXNlCgojcmVtb3ZlIG9yaWdpbmFsIGNvbHVtbiBmcm9tIGRhdGEgZnJhbWUKY29yckRhdGEkZGF0YWJhc2UgPC0gTlVMTAoKY29yck1hdCA8LSBkYXRhLm1hdHJpeChjb3JyRGF0YSkKCmNvbF9kZW5kIDwtIGRlbmRzb3J0KGhjbHVzdChkaXN0KHQoY29yck1hdCkpKSkKCkhlYXRtYXAoY29yck1hdCwgCiAgICAgICAgY2x1c3Rlcl9yb3dzID0gRkFMU0UsIAogICAgICAgIGNvbHVtbl90aXRsZSA9ICJSUk0yQiAtIDEyNSBHTyIsIAogICAgICAgIGNvbHVtbl90aXRsZV9zaWRlID0gImJvdHRvbSIsIAogICAgICAgIG5hbWUgPSAiciB2YWx1ZSIsCiAgICAgICAgY29sID0gY29sX2Z1bikKYGBgCgpgYGB7cn0KY29yckRhdGEgPC0gcmVhZC5jc3YoJy9Vc2Vycy9zaGFuZ2hvbmdzaW0vRG9jdW1lbnRzL0dpdEh1Yi9IVS1BVFJpLUNvZGUtUmVwb3NpdG9yeS9yIHZhbHVlcyBwNTMgLSAxMjUgR08gc2NyZWVuIHdpdGggYXZlcmFnZS5jc3YnLCBoZWFkZXIgPSBUUlVFKQoKI3NldCBzcGVjaWZpYyBjb2x1bW4gYXMgcm93IG5hbWVzCnJvd25hbWVzKGNvcnJEYXRhKSA8LSBjb3JyRGF0YSRkYXRhYmFzZQoKI3JlbW92ZSBvcmlnaW5hbCBjb2x1bW4gZnJvbSBkYXRhIGZyYW1lCmNvcnJEYXRhJGRhdGFiYXNlIDwtIE5VTEwKCmNvcnJNYXQgPC0gZGF0YS5tYXRyaXgoY29yckRhdGEpCgpjb2xfZGVuZCA8LSBkZW5kc29ydChoY2x1c3QoZGlzdCh0KGNvcnJNYXQpKSkpCgpIZWF0bWFwKGNvcnJNYXQsIAogICAgICAgIGNsdXN0ZXJfcm93cyA9IEZBTFNFLCAKICAgICAgICBjb2x1bW5fdGl0bGUgPSAicDUzIC0gMTI1IEdPIiwgCiAgICAgICAgY29sdW1uX3RpdGxlX3NpZGUgPSAiYm90dG9tIiwgCiAgICAgICAgbmFtZSA9ICJyIHZhbHVlIiwKICAgICAgICBjb2wgPSBjb2xfZnVuKQpgYGAKCmBgYCByCntyfQpgYGAKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K